package org.cjprods.icerupt;

import java.io.IOException;
import java.lang.invoke.ConstantCallSite;
import java.nio.FloatBuffer;
import java.nio.channels.Pipe;
import java.util.HashMap;

import com.hackoeur.jglm.Mat3;
import com.hackoeur.jglm.Mat4;
import com.hackoeur.jglm.Matrices;
import com.hackoeur.jglm.Vec;
import com.hackoeur.jglm.Vec3;
import com.hackoeur.jglm.Vec4;

import org.lwjgl.BufferUtils;
import org.lwjgl.system.MathUtil;

import static org.lwjgl.opengl.GL11.*;
import static org.lwjgl.opengl.GL12.*;
import static org.lwjgl.opengl.GL13.*;
import static org.lwjgl.opengl.GL14.*;
import static org.lwjgl.opengl.GL15.*;
import static org.lwjgl.opengl.GL20.*;
import static org.lwjgl.opengl.GL21.*;
import static org.lwjgl.opengl.GL30.*;
import static org.lwjgl.opengl.GL31.*;
import static org.lwjgl.opengl.GL32.*;
import static org.lwjgl.opengl.GL33.*;


public class rotator
{
	Vec3 rotation;
	Mat3 m;
	float min;
	float max;

	public Mat3 get() { return m; }
	
	public rotator(float min, float max)
	{
		float pi = 3.141592654f;
		this.min = min * pi / 180.0f;
		this.max = max * pi / 180.0f;;
		reset();
	}
	
	public void reset()
	{
		rotation = new Vec3();
	}
	
	public void rotate(Vec3 offset)
	{
		rotation = rotation.add(offset);
		rotation = new Vec3(utils.clamp(rotation.getX(), min, max),
				rotation.getY(), rotation.getZ());
	}
	
	public void update()
	{	
		Mat4 mz = Matrices.rotate(rotation.getY(), new Vec3(0.0f, 1.0f, 0.0f))
					.multiply(Matrices.rotate(rotation.getX(), new Vec3(1.0f, 0.0f, 0.0f)));
		//			.multiply(new Vec4(0.0f, 0.0f, 1.0f, 0.0f));
		
		Vec3 zz = utils.reduce_dimension(mz).multiply(new Vec3(0.0f, 0.0f, 1.0f));

		Vec3 z = new Vec3(zz.getX(), zz.getY(), zz.getZ()); 
		Vec3 y = new Vec3(0.0f, 1.0f, 0.0f);
		Vec3 x = y.cross(z).getUnitVector();
		y = z.cross(x);
		m = new Mat3(x, y, z);		
	}

}
